Rozkład prawdopodobieństwa w grze Monopoly

Opis problemu :

"Plansza w grze Monopoly wygląda nastepująco:";
Obrazek=;

"Gracz zaczyna na polu GO i co kolejkę rzuca dwoma kośćmi sześciennymi. Następnie porusza się zgodnie z ruchem wskazówek zegara o sumę rzuconych oczek. Gdyby nie było innych zasad to prawdopodobieństwo wylądowania na każdym polu jest równe 2.5%. Jednak wylądowanie na polu G2J(Go To Jail - Idź do więzienia), CC(Community Chest - Kasa Społeczna) oraz CH(Chance - Szansa) zmienia ten rozkład.";
"Oprócz G2J i po jednej karcie z CC i CH, które rozkazują iść prosto do więzienia, jeśli gracz trzy razy będzie miał tą samą ilość oczek na obu kościach, to za trzecim razem idzie do więzienia.";
"Dla uproszczenia, pola planszy można ponumerować od 00 do 39. Tak więc pole GO to 00, pole G2J to 10, pole C2 to 13 itd.";
"Na polach CC i CH gracz ciągnie kartę z odpowiednich talii, które mają określone efekty - w tym komendy 'Idziesz na pole X'. Wszystkie pozostałe komendy nie są istotne dla naszego problemu. Na początku gry talie zostają potasowane, po każdym pociągnięciu karty, gracz zwraca daną kartę na spód talii.";
"Oto lista interesujących nas kart w taliach CC i CH:
CC:
Wszystkich kart - 16
Idziesz na pole 00
Idziesz na pole 10
CH:
Wszystkich kart - 16
Idziesz na pole 00
Idziesz na pole 10
Idziesz na pole 11
Idziesz na pole 24
Idziesz na pole 39
Idziesz na pole 5
Idziesz na następne pole R
Idziesz na następne pole R
Idziesz na następne pole U
Cofasz się o trzy pola" ;
"Jak można się spodziewać, najmniejsze prawdopodobieństwa będą miały pola CH, ponieważ prawdopodobieństwo pozostania na tym polu jest równe 6/16 - tylko 6 kart z 16 nie wysyła nas na inne pola.
Problem polega na znalezieniu trzech najbardziej prawdopodobnych pól dla rzutu dwoma koścmi czterościennymi.";

Rozwiązanie problemu :

"Problem ten postanowiłem rozwiązać przez symulację, tj. stworzyć symulację ruchu pionka po planszy do gry Monopoly, zgodnie z zasadami gry. Dla wystarczającej ilości iteracji prawdopodobieństwo wyzaczone w ten sposób jest bliskie prawdziwemu prawdopodobieństwu. 
Posłużyłem się przy tym dwoma uproszczeniami, które nie mają wpływu na wynik:
1. Nie tasuję talii CC i CH
2. Omijam zasadę dotyczącą długości pobytu w więzieniu - zakładam, że wychodzę zaraz po wejściu.
Założyłem też, że jeśli już dostaniemy się do więzienia, to liczymy od nowa ilość wyrzuconych pod rząd par.";
"Talię CC i CH przedstawiam jako listę 16 elementów. Każdy element jest liczbą całkowitą, która określa na które pole ma się udać pionek. 
Dla liczb większych od zera pionek udaje się na pole o danym numerze.
Jeśli jest to -1, to pionek pozostaje w miejscu.
Jeśli jest to -2, to pionek ma sie przenieść na następne U.
Jeśli jest to -5, to pionek ma się przenieść na następne R.
Jeśli jest to -3, to pionek cofa się o trzy pola.";

CC={0,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
CH={0,10,11,24,39,5,-5,-5,-2,-3,-1,-1,-1,-1,-1,-1};

(*Jest to funkcja symulująca rzut kostką. Tworzy ona listę trzyelementową. Pierwszy element, to ilość oczek na pierwszej osi, drugi na drugiej. Trzeci to suma wyrzuconych oczek a czwarty mówi nam, czy pierwsze dwa elementy są równe.*)RzutKoscia:={PierwszaKosc=RandomInteger[{1,4}],DrugaKosc=RandomInteger[{1,4}],PierwszaKosc+DrugaKosc,If[PierwszaKosc==DrugaKosc,1,0]}

Iteracje=1000000; (*Określa ile razy rzucamy kością, a co za tym idzie dokładność całej operacji*)
Rozklad=Table[0,{Iteracje}];(*Określa na którym miejscu pionek znalazł się po i-tym rzucie*)
Pozycja=0; (*Określa aktualną pozycję pionka*)
Licznik=0; (*Służy do sprawdzania ile razy wyrzuciliśmy to samo na obu kościach*)
LicznikCC=1;(*Służy do określenia którą kartę z talii CC chcemy teraz wyciągnąć*)
LicznikCH=1; (*Odpowiednio dla CH*)
TAKIETAM=0;
For[i=1,i<Iteracje,i++,
a=RzutKoscia;(*Rzuca koscia*)
Pozycja=Pozycja+a[[3]];

(*Sprawdza, czy nie bylo trzech par pod rzad*)
If[a[[4]]==1, Licznik++];
If[a[[4]]==0, Licznik=0];
If[Licznik==3,Pozycja=10;Licznik=0];

(*Sprawdza, czy nie wpadlismy na CH. Sprawdzenie CH musi być przed sprawdzeniem CC, ponieważ z pola CH3(36) możemy wpaść na pole CC3(33)*)

If[Pozycja==7 || Pozycja==22 || Pozycja==36, 
If[CH[[LicznikCH]]==-1,,
If[CH[[LicznikCH]]==-5, Pozycja=10*(Floor[(Pozycja+5)/10])+5,
If[CH[[LicznikCH]]==-2, If[Pozycja<12,Pozycja=12,Pozycja=28],
If[CH[[LicznikCH]]==-3,Pozycja=Pozycja-3,
Pozycja=CH[[LicznikCH]] ] 
]
]
]; LicznikCH++;
];

If[LicznikCH>16,LicznikCH=1];

(*Sprawdza, czy nie wpadlismy na CC*)
If[Pozycja==2 || Pozycja==17 || Pozycja==33,
If[CC[[LicznikCC]]==-1,,
Pozycja=CC[[LicznikCC]]];LicznikCC++
];
If[LicznikCC>16,LicznikCC=1];

(*Robi kółko, jeślibyśmy wyszli "poza planszę"*)
If[Pozycja>39,Pozycja=Pozycja-40];
If[Pozycja==30, Pozycja=10];

(*Zeruje licznik podwojnego rzutu jeśli trafiliśmy do więzienia*)
If[Pozycja==10,Licznik=0];
(*Wpisuje aktualna pozycje do rozkladu*)
Rozklad[[i]]=Pozycja
]

(*Ta funkcja sortuje pola wedle tego ile razy były odwiedzone, od najrzadziej odwiedzanego do najczęściej odwiedzanego*)
Posortowane=Sort[Tally[Rozklad], #1[[2]]>#2[[2]]&]

(*Rysuje wykres rozkładu lądowania na danych polach. Na linii leżałyby punkty, gdyby wszystkie pola miały to samo prawdopodobieńtwo.*)
Show[ListPlot[Posortowane, PlotRange->{{0,40},{0,Iteracje*1.5/20}}],Plot[Iteracje/40,{x,0,40}]]

(*Liczy przybliżone prawdopodobieństwo wylądowania na danym polu*)
Probal=Table[{Posortowane[[j,1]],N[Posortowane[[j,2]]/Iteracje]},{j,1,Length[Posortowane]}]

Wynik

"Najczęściej występujące pola mają numery:"
{Posortowane[[1,1]], Posortowane[[2,1]] ,Posortowane[[3,1]]}